1. 数猫をpdfにする
Python に ReportLab というモジュールを導入して、これを用いて pdf ファイルを作ることに挑戦しましょう。Python のインストールや基本的な使い方は知っているものとして話を進めます。ReportLab に関しても、ネットに記事が数多くありますのでそれに従ってインストールしてください。 paper.pyという名前のPythonのプログラムファイルを作成していきましょう。
code:paper.py(python)
from reportlab.pdfgen import canvas
mm = 72 / 25.4
A4 = (210 * mm, 297 * mm)
C = canvas.Canvas("paper.pdf", pagesize = A4)
pdf ファイルを作成するために、canvas と呼ばれるクラスを用い ます。
ReportLab では、72dpi という解像度の 1 ドットか単位となっています。1 インチは 25.4 ミリメートルです。そこで、mm には 1mm 当り のドット数 72/25.4=2.83464566929 を定義しておきます。
A4 は、A4 版の紙の大きさを定義しています。
描画するキャンバスを生成して、それを C と名前の変数に代入します。以後、描画命令は C に対して発していきます。paper.pdf はこのキ ャンバスをセーブするとできるファイル名です。
code:paper.py(python)
CellSize = 15 * mm
Side = CellSize * 9
Margin = 30 * mm
Left = Margin
Right = Left + Side
Bottom = Top - Side
CellSize を数猫のマス目の 1 辺の長さを表す変数として、15 ミリメートルにします。Side は 9×9 個のセル全部の正方形の一辺の長さです。Margin は左と上の余白の幅で、3 センチメートルとしています。
正方形の上下左右の位置を計算しています。ReportLabで゙は、ぺージの左下隅を原点とした xy 座標系で位置を表します。
https://gyazo.com/6100ad4b0927fb5d1502ca4e7730d6a7
code:paper.py(python)
def paper(fn):
C = canvas.Canvas(fn, pagesize = A4)
C.setLineWidth(1.0 * mm)
C.setLineWidth(0.25 * mm)
x = Left + i * CellSize
C.line(x, Top, x, Bottom)
y = Bottom + i * CellSize
C.line(Left, y, Right, y)
C.setLineWidth(0.5 * mm)
x = Left + i * CellSize
C.line(x, Top, x, Bottom)
y = Bottom + i * CellSize
C.line(Left, y, Right, y)
C.setLineWidth(1.0 * mm)
C.rect(Left, Bottom, Side, Side)
return C
関数 paper を定義します。引数 fn は作成する pdf ファイルの名前です。
大きさかがA4 のキャンバスを作成します。このキャンバスは fn に定義されている pdf ファイルに書き出されます。
罫線を描画しています。最初に細い線(0.25mm)を引いて、 次に少し太めの線(0.5mm)を引いて、最後に太い線(1mm)で大きい正方 形を描いています。
キャンバスを戻り値とします。
code:paper.py(python)
def draw(C, n, i, j):
C.setFont("Helvetica", CellSize)
num = str(n)
width = C.stringWidth(num, "Helvetica", CellSize)
dx = (CellSize - width) / 2
dy = dx * 0.7
x = Left + j * CellSize + dx
y = Top - (i + 1) * CellSize + dy
C.drawString(x, y, num)
キャンバス C に描かれている数猫の(i,j)セルに数 n を描画する関数を定義します。
Helvetica という名前のフォントを使い、 大きさをセルの幅とします。
整数を文字に変換します。
変換された文字の実際の幅を求めます。
セルの中央に印字するための x 方向 y 方向のずらし幅を計算します。
(i,j)から文字を描画する場所(x,y)を計算します。
文字を描画します。
code:paper.py(python)
if __name__ == "__main__":
C = paper("paper.pdf")
for i in range(9):
for j in range(9):
if n != 0:
draw(C, n, i, j)
C.save()
このプログラムは、後に他のプログラムから引用(import)します。引用されるときには実行さず゙、直接このプログラムを run したときだけ実行したいコードはこのような if 文の下にインデントを付けて書きます。
リスト A で数猫の問題を定義します。空白は 0 とします。
数猫のマス目が描かれたキャンバスを生成します。このキャンバス保存される pdf ファイルの名前も決めます。
A に従って、キャンバスに 0 以外の数字をセルに書き込みます。
キャンバスを pdf ファイルに保存します。